/* 
给你两个整数数组 nums1 和 nums2 ，请你以数组形式返回两数组的交集。
返回结果中每个元素出现的次数，应与元素在两个数组中都出现的次数一致（如果出现次数不一致，则考虑取较小值）。可以不考虑输出结果的顺序。

 
 
示例 1：

输入：nums1 = [1,2,2,1], nums2 = [2,2]
输出：[2,2]

输入：nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出：[4,9]

*/

/* 
思路1:用map哈希结构存储较短的数组，属性名为每一项，属性值为出现的次数
遍历另一个数组，判断每一项是否存在于上面的map中，存在则返回此数且次数-1，如果此时次数已经为0，则不返回次数

思路2：双指针
对数组排序后，遍历每一项，比较两项，如果相等则返回且都往右移，否则就数字小的那项右移
*/
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
 var intersection = function(nums1, nums2) {
     const n1=nums1.length
     const n2=nums2.length
    //  思路1
    /* let map1=new Map()
    let ret=[]
    for (let i = 0; i < n1; i++) {
        // console.log(map1.has(nums1[i]));
        if(map1.has(nums1[i])){
            let count=map1.get(nums1[i])
            console.log(count);
            map1.set(nums1[i],++count)
            console.log(map1);
        }else{
            map1.set(nums1[i],1)
        }
    }
    for (let j = 0; j < n2; j++) {
        if(map1.has(nums2[j])){
            // 出现次数大于0时
            if(map1.get(nums2[j])>0){
                let count=map1.get(nums2[j])
                map1.set(nums2[j],--count)
                ret.push(nums2[j])
            }
        }
    }
    return ret */

    // 思路2
    // 排序
    nums1.sort((a,b)=> a-b)
    nums2.sort((a,b)=> a-b)
    let l=0,r=0
    let ret=[]
    while(l<n1&&r<n2){
        if(nums1[l]==nums2[r]){
            ret.push(nums1[l])
            l++
            r++
        }else{
            nums1[l]<nums2[r]?l++:r++
        }
    }
    return ret
};
// 运行

let nums1 = [1,2], nums2 = [1,1]
console.log(intersection(nums1,nums2));